/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.skatiger.jrove.el.implicaitobject;

import java.beans.FeatureDescriptor;

import javax.el.ELContext;
import javax.el.ELResolver;

import org.skatiger.jrove.ExternalContext;
import org.skatiger.jrove.ViewContext;

public abstract class ImplicitObject {

    protected ExternalContext externalContext(final ELContext context) {
        ViewContext viewContext = viewContext(context);
        if (viewContext != null) {
            return viewContext(context).getExternalContext();
        }
        return null;
    }

    public abstract FeatureDescriptor getDescriptor();

    /**
     * Returns an interned String representing the name of the implicit object.
     */
    public abstract String getName();

    public abstract Object getValue(ELContext context);

    protected FeatureDescriptor makeDescriptor(String name, String description,
            Class<?> elResolverType) {
        FeatureDescriptor fd = new FeatureDescriptor();
        fd.setValue(ELResolver.RESOLVABLE_AT_DESIGN_TIME, Boolean.TRUE);
        fd.setValue(ELResolver.TYPE, elResolverType);
        fd.setName(name);
        fd.setDisplayName(name);
        fd.setShortDescription(description);
        fd.setExpert(false);
        fd.setHidden(false);
        fd.setPreferred(true);
        return fd;
    }

    protected ViewContext viewContext(final ELContext context) {
        return ViewContext.findViewContext(context);
    }
}
